package rbb.itm5.bwinf.roboter.Model;

import java.awt.Dimension;
import java.awt.Point;

/**
 * Diese Klasse speichert alle Informationen für ein Hindernis bzw. eine Wand.
 *
 * @author Dominik Jakielski
 */
public class Obstacle {

    private int x, y, width, height;
    private boolean isOnTheWall = false, editable = false;

    /**
     * Erstellt ein Hindernis
     *
     * @param x horizontale Position
     * @param y vertikale Position
     * @param width Breite des Hindernis
     * @param height Höhe des Hindernis
     */
    public Obstacle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.isOnTheWall = false;
    }

    /**
     * Erstellt ein Hindernis als Wand
     *
     * @param x horizontale Position
     * @param y vertikale Position
     * @param width Breite des Hindernis
     * @param height Höhe des Hindernis
     * @param isOnTheWall Ist das Hindernis eine Wand?
     */
    public Obstacle(int x, int y, int width, int height, boolean isOnTheWall) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.editable = true;
        this.isOnTheWall = isOnTheWall;
    }

    /**
     * Gibt die Position als Point zurück.
     *
     * @see Point
     * @return Position des Hindernis
     */
    public Point getPostion() {
        return new Point(x, y);
    }

    /**
     * Gibt die Größe des Hindernis als Dimension zurück.
     *
     * @see Dimension
     * @return Größe des Hindernis
     */
    public Dimension getSize() {
        return new Dimension(width, height);
    }

    /**
     * Ist das Hindernis eine Teil einer Wand?
     *
     * @return ist Wand
     */
    public boolean isOnTheWall() {
        return isOnTheWall;
    }

    /**
     * De- Aktiviert den Bearbeitungsmodus muss die Eigenschaften eines
     * Hindernis zu bearbeiten.
     *
     * @param editable Status True= Eingeschaltet, False=Ausgeschaltet
     */
    public void setEditable(boolean editable) {
        this.editable = editable;
    }

    /**
     * Setter für den X-Wert <br>Eine Bearbeitung kann erst erfolgen, wenn
     * vorher das Objekt mit setEditable(true) als Editierbar gekennzeichnet
     * wurde.
     *
     * @param x Neuer X-Wert
     */
    public void setX(int x) {
        if (!editable) {
            return;
        }
        this.x = x;
    }

    /**
     * Setter für den Y-Wert <br>Eine Bearbeitung kann erst erfolgen, wenn
     * vorher das Objekt mit setEditable(true) als Editierbar gekennzeichnet
     * wurde.
     *
     * @param y Neuer Y-Wert
     */
    public void setY(int y) {
        if (!editable) {
            return;
        }
        this.y = y;
    }

    /**
     * Setter für den Breite-Wert <br>Eine Bearbeitung kann erst erfolgen, wenn
     * vorher das Objekt mit setEditable(true) als Editierbar gekennzeichnet
     * wurde.
     *
     * @param width Neuer Breite-Wert
     */
    public void setWidth(int width) {
        if (!editable) {
            return;
        }
        this.width = width;
    }

    /**
     * Setter für den Höhe-Wert <br>Eine Bearbeitung kann erst erfolgen, wenn
     * vorher das Objekt mit setEditable(true) als Editierbar gekennzeichnet
     * wurde.
     *
     * @param height Neuer Höhe-Wert
     */
    public void setHeight(int height) {
        if (!editable) {
            return;
        }
        this.height = height;
    }

    /**
     * Setter für die istAnWand Eigenschaft. <br>Eine Bearbeitung kann erst
     * erfolgen, wenn vorher das Objekt mit setEditable(true) als Editierbar
     * gekennzeichnet wurde.
     *
     * @param isOnTheWall Neuer istAnWand-Wert
     */
    public void setOnTheWall(boolean isOnTheWall) {
        if (!editable) {
            return;
        }
        this.isOnTheWall = isOnTheWall;
    }

    @Override
    /**
     * Gibt das Hindernis als Text aus.
     */
    public String toString() {
        return "x=" + x + " , y=" + y + " , width=" + width + " , height=" + height;
    }
}
